﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Messaging;
using ProtocoloCarSharing;

namespace ServidorCommunications
{
    public class MSMQManager
    {
        private static MSMQManager Instancia = null;
        static MessageQueue queueReceptor;
        static MessageQueue queueEnvio;

        public static MSMQManager GetInstancia()
        {
            if (Instancia == null)
            {
                Instancia = new MSMQManager();
            }

            return Instancia;
        }

        private MSMQManager()
        {

            string nomMQServGestion = (ConfigurationManager.AppSettings["nomMSMQServGestion"]);
            string nomMQServComm = (ConfigurationManager.AppSettings["nomMSMQServComunicacion"]);

            //Inicializo la cola receptora de Msg
            if (MessageQueue.Exists(nomMQServComm))
            {
                queueReceptor = new MessageQueue(nomMQServComm);
            }
            else
            {
                queueReceptor = MessageQueue.Create(nomMQServComm);
            }

            queueReceptor.Formatter = new XmlMessageFormatter(new Type[] { typeof(MensajeProtocolo) });

             //Inicializo la cola de envio
            queueEnvio = new MessageQueue(nomMQServGestion);
        }

        public MensajeProtocolo EnviarMSMQ(string label, MensajeProtocolo msj)
        {
            MensajeProtocolo msgRecibido = null;

            try
            {
                if (queueEnvio == null)
                {
                    string nomMQServCobro = (ConfigurationManager.AppSettings["nomMSMQServGestion"]);
                    queueEnvio = new MessageQueue(nomMQServCobro);
                }

                Message msgAEnviar = new Message(msj);
                queueEnvio.Send(msgAEnviar, label);
                string idMsg = msgAEnviar.Id;

                TimeSpan ts = new TimeSpan(10000000);
                Message msg = queueReceptor.ReceiveByCorrelationId(idMsg, ts);
                msgRecibido = (MensajeProtocolo)msg.Body;

                Console.WriteLine("Mensaje de la Servidor Gestion Clientes: " + msgRecibido.Datos);
            }
            catch (MessageQueueException e)
            {
                Console.WriteLine(e.Message);
                msgRecibido = new MensajeProtocolo(Protocolo.Header.RES, Protocolo.Comando.SERVIDOR_FUERA_DE_SERVICIO, e.Message.Length, e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                msgRecibido = new MensajeProtocolo(Protocolo.Header.RES, Protocolo.Comando.SERVIDOR_FUERA_DE_SERVICIO, e.Message.Length, e.Message);
            }

            return msgRecibido;
        }
    }
}
